#ifndef AUTH_SERVICE_H
#define AUTH_SERVICE_H

#include "network/epoll_server.h"
#include "database/mysql_pool.h"
#include "cache/redis_client.h"
#include <string>
#include <memory>
#include <unordered_map>
#include <nlohmann/json.hpp>

namespace service {
namespace auth {

// 用户结构
struct User {
    int id;
    std::string username;
    std::string nickname;
    std::string email;
    std::string passwordHash;
    std::string salt;
    std::string avatar;
    std::string createdAt;
    std::string lastLogin;
    int status; // 0: 禁用, 1: 正常
    
    // 转换为JSON对象（不包含敏感信息）
    nlohmann::json toJson() const;
    
    // 从JSON对象构造
    static User fromJson(const nlohmann::json& json);
};

// 认证服务类
class AuthService {
public:
    // 创建认证服务
    static std::shared_ptr<AuthService> create(
        std::shared_ptr<database::MySQLPool> dbPool,
        std::shared_ptr<cache::RedisClient> redisClient);
    
    // 启动服务
    bool start(int port);
    
    // 停止服务
    void stop();
    
    // 用户注册
    int registerUser(const std::string& username, const std::string& password, 
                     const std::string& email, const std::string& nickname);
    
    // 用户登录
    std::string login(const std::string& username, const std::string& password);
    
    // 验证token
    bool verifyToken(const std::string& token, int& userId);
    
    // 获取用户信息
    User getUserById(int id);
    User getUserByUsername(const std::string& username);
    
    // 更新用户信息
    bool updateUser(const User& user);
    
    // 修改密码
    bool changePassword(int userId, const std::string& oldPassword, const std::string& newPassword);
    
    // 重置密码
    bool resetPassword(const std::string& email);
    
private:
    AuthService(std::shared_ptr<database::MySQLPool> dbPool,
               std::shared_ptr<cache::RedisClient> redisClient);
    
    // 处理客户端连接
    void handleConnection(std::shared_ptr<network::Connection> conn);
    
    // 处理客户端消息
    void handleMessage(std::shared_ptr<network::Connection> conn, const std::string& message);
    
    // 处理客户端断开连接
    void handleClose(std::shared_ptr<network::Connection> conn);
    
    // 处理API请求
    std::string handleRequest(const std::string& path, const std::string& method, 
                             const nlohmann::json& params);
    
    // 生成密码哈希
    std::string hashPassword(const std::string& password, const std::string& salt);
    
    // 生成随机盐值
    std::string generateSalt();
    
    // 生成token
    std::string generateToken(int userId);
    
    // 从缓存获取用户
    User getUserFromCache(int id);
    
    // 将用户存入缓存
    void cacheUser(const User& user);

private:
    std::shared_ptr<database::MySQLPool> dbPool_;
    std::shared_ptr<cache::RedisClient> redisClient_;
    std::unique_ptr<network::EpollServer> server_;
    bool isRunning_;
};

} // namespace auth
} // namespace service

#endif // AUTH_SERVICE_H 